ããéããããå¹ççãªã³ãŒããå®çŸãããã¯ãã©ããã³ã°ã貪欲ããããšé å»¶ããããããé«åºŠãªãšã³ãžã³åºæã®ãã¥ãŒãã³ã°ãŸã§ãæ£èŠè¡šçŸã®æé©åã«äžå¯æ¬ ãªãã¯ããã¯ãåŠã³ãŸãã
æ£èŠè¡šçŸã®æé©åïŒRegexããã©ãŒãã³ã¹ãã¥ãŒãã³ã°ã®è©³çŽ°è§£èª¬
æ£èŠè¡šçŸïŒregexïŒã¯ãçŸä»£ã®ããã°ã©ããŒã®ããŒã«ãããã«ãããŠäžå¯æ¬ ãªããŒã«ã§ãããŠãŒã¶ãŒå ¥åã®æ€èšŒããã°ãã¡ã€ã«ã®è§£æãããé«åºŠãªæ€çŽ¢çœ®ææäœãããŒã¿æœåºãŸã§ããã®ãã¯ãŒãšæ±çšæ§ã¯åŠå®ã§ããŸããããããããã®ãã¯ãŒã«ã¯é ããã³ã¹ãã䌎ããŸããäžååã«æžãããæ£èŠè¡šçŸã¯ãéããªããã©ãŒãã³ã¹ãã©ãŒãšãªããé倧ãªé å»¶ãåŒãèµ·ãããCPU䜿çšçã®æ¥äžæãæããææªã®å Žåã«ã¯ã¢ããªã±ãŒã·ã§ã³ã忢ãããŠããŸãããšããããŸããããã§ãæ£èŠè¡šçŸã®æé©åã¯ãããã°è¯ããã¹ãã«ã§ã¯ãªããå ç¢ã§ã¹ã±ãŒã©ãã«ãªãœãããŠã§ã¢ãæ§ç¯ããããã«äžå¯æ¬ ãªã¹ãã«ãšãªãã®ã§ãã
ãã®å æ¬çãªã¬ã€ãã§ã¯ãæ£èŠè¡šçŸã®ããã©ãŒãã³ã¹ã®äžçãæ·±ãæãäžããŠãããŸããäžèŠåçŽãªãã¿ãŒã³ããªã壿» çã«é ããªãã®ããæ¢ããæ£èŠè¡šçŸãšã³ãžã³ã®å éšåäœãçè§£ããæ£ããã ãã§ãªããé©ãã»ã©é«éãªæ£èŠè¡šçŸãæžãããã®åŒ·åãªååãšãã¯ããã¯ã®ã»ããã身ã«ã€ããŠããã ããŸãã
ããªãããçè§£ããïŒè³ªã®æªãæ£èŠè¡šçŸã®ã³ã¹ã
æé©åãã¯ããã¯ã«é£ã³èŸŒãåã«ãç§ãã¡ã解決ããããšããŠããåé¡ãçè§£ããããšãéèŠã§ããæ£èŠè¡šçŸã«é¢é£ããæãæ·±å»ãªããã©ãŒãã³ã¹åé¡ã¯å£æ» çãªããã¯ãã©ããã³ã°ãšããŠç¥ãããŠãããããã¯æ£èŠè¡šçŸãµãŒãã¹æåŠïŒReDoSïŒè匱æ§ã«ã€ãªããå¯èœæ§ããããŸãã
壿» çãªããã¯ãã©ããã³ã°ãšã¯ïŒ
壿» çãªããã¯ãã©ããã³ã°ã¯ãæ£èŠè¡šçŸãšã³ãžã³ãããããèŠã€ããïŒãŸãã¯ããããäžå¯èœã§ãããšå€æããïŒã®ã«éåžžã«é·ãæéããããå Žåã«çºçããŸããããã¯ãç¹å®ã®ã¿ã€ãã®ãã¿ãŒã³ãç¹å®ã®ã¿ã€ãã®å ¥åæååã«å¯ŸããŠå®è¡ããããšãã«èµ·ãããŸãããšã³ãžã³ã¯ããã¿ãŒã³ãæºããããã«ããããå¯èœãªçµè·¯ã詊ããããŸããããé åã®è¿·è·¯ã«éã蟌ããããŸããã¹ãããæ°ã¯å ¥åæååã®é·ããšãšãã«ææ°é¢æ°çã«å¢å ããã¢ããªã±ãŒã·ã§ã³ãããªãŒãºãããã®ããã«èŠããç¶æ ã«è³ããŸãã
ãã®èåŒ±ãªæ£èŠè¡šçŸã®å€å
žçãªäŸãèããŠã¿ãŸãããïŒ^(a+)+$
ãã®ãã¿ãŒã³ã¯ååã«åçŽã«èŠããŸãã1ã€ä»¥äžã®'a'ã§æ§æãããæååãæ¢ããŸãããaãããaaãããaaaaaãã®ãããªæååã«å¯ŸããŠã¯å®ç§ã«æ©èœããŸããåé¡ã¯ããaaaaaaaaaaaaaaaaaaaaaaaaaaabãã®ããã«ãã»ãšãã©ããããããæçµçã«å€±æããæååã«å¯ŸããŠãã¹ããããšãã«çºçããŸãã
ããããªãããã»ã©é ãã®ãã®çç±ã§ãïŒ
- å€åŽã®
(...)+ãšå åŽã®a+ã¯ã©ã¡ãã貪欲ãªéæå®åã§ãã - å
åŽã®
a+ã¯æåã«27åãã¹ãŠã®'a'ã«ãããããŸãã - å€åŽã®
(...)+ã¯ãã®1åã®ãããã§æºè¶³ããŸãã - 次ã«ããšã³ãžã³ã¯æååã®çµããã瀺ãã¢ã³ã«ãŒ
$ã«ãããããããšããŸãããããã'b'ããããã倱æããŸãã - ããã§ããšã³ãžã³ã¯ããã¯ãã©ãã¯ããªããã°ãªããŸãããå€åŽã®ã°ã«ãŒãã1æåã諊ãããããå
åŽã®
a+ã¯26åã®'a'ã«ãããããå€åŽã®ã°ã«ãŒãã®2åç®ã®ç¹°ãè¿ããæåŸã®'a'ã«ãããããããšããŸããããã'b'ã§å€±æããŸãã - ãšã³ãžã³ã¯ã'a'ã®æååãå
åŽã®
a+ãšå€åŽã®(...)+ã®éã§åå²ãããã¹ãŠã®å¯èœãªæ¹æ³ã詊ããŸããNåã®'a'ã®æååã®å Žåããããåå²ããæ¹æ³ã¯2N-1éããããŸããè€éãã¯ææ°é¢æ°çã§ãããåŠçæéã¯æ¥éš°ããŸãã
ãã®äžèŠç¡å®³ã«èŠããåäžã®æ£èŠè¡šçŸããCPUã³ã¢ãæ°ç§ãæ°åããããã¯ãã以äžããã¯ããä»ã®ããã»ã¹ããŠãŒã¶ãŒãžã®ãµãŒãã¹ãäºå®äžæåŠããããšãã§ããŸãã
åé¡ã®æ žå¿ïŒæ£èŠè¡šçŸãšã³ãžã³
æ£èŠè¡šçŸãæé©åããã«ã¯ããšã³ãžã³ãã©ã®ããã«ãã¿ãŒã³ãåŠçããããçè§£ããå¿ èŠããããŸããæ£èŠè¡šçŸãšã³ãžã³ã«ã¯äž»ã«2ã€ã®ã¿ã€ããããããã®å éšåäœãããã©ãŒãã³ã¹ç¹æ§ã決å®ããŸãã
DFA (決å®çæéãªãŒãããã³) ãšã³ãžã³
DFAãšã³ãžã³ã¯æ£èŠè¡šçŸã®äžçã®ã¹ããŒãçã§ããå
¥åæååãå·Šããå³ãžã1æåãã€äžåºŠã®ãã¹ã§åŠçããŸããä»»æã®æç¹ã§ãDFAãšã³ãžã³ã¯çŸåšã®æåã«åºã¥ããŠæ¬¡ã®ç¶æ
ãäœã§ããããæ£ç¢ºã«ç¥ã£ãŠããŸããããã¯ãããã¯ãã©ãã¯ããå¿
èŠããŸã£ãããªãããšãæå³ããŸããåŠçæéã¯ç·åœ¢ã§ãããå
¥åæååã®é·ãã«çŽæ¥æ¯äŸããŸããDFAããŒã¹ã®ãšã³ãžã³ã䜿çšããããŒã«ã®äŸã«ã¯ãgrepãawkãªã©ã®äŒçµ±çãªUnixããŒã«ãå«ãŸããŸãã
é·æïŒéåžžã«é«éã§äºæž¬å¯èœãªããã©ãŒãã³ã¹ã壿» çãªããã¯ãã©ããã³ã°ã®åœ±é¿ãåããªãã
çæïŒæ©èœã»ãããéå®çãããã¯ãªãã¡ã¬ã³ã¹ãå èªã¿ã»åŸèªã¿ããã£ããã£ã°ã«ãŒããªã©ãããã¯ãã©ãã¯ã®èœåã«äŸåããé«åºŠãªæ©èœã¯ãµããŒãããŠããŸããã
NFA (éæ±ºå®çæéãªãŒãããã³) ãšã³ãžã³
NFAãšã³ãžã³ã¯ãPythonãJavaScriptãJavaãC# (.NET)ãRubyãPHPãPerlãªã©ã®çŸä»£ã®ããã°ã©ãã³ã°èšèªã§æãäžè¬çã«äœ¿çšãããã¿ã€ãã§ãããããã¯ããã¿ãŒã³é§ååãã§ããããšã³ãžã³ããã¿ãŒã³ã«åŸããæååãé²ã¿ãªããåŠçããŸããææ§ãªç¹ïŒéžæ|ãéæå®å*, +ãªã©ïŒã«å°éãããšãäžã€ã®ãã¹ã詊ããŸãããã®ãã¹ãæçµçã«å€±æããå ŽåãæåŸã®æ±ºå®ç¹ãŸã§ããã¯ãã©ãã¯ããæ¬¡ã«å©çšå¯èœãªãã¹ã詊ããŸãã
ãã®ããã¯ãã©ãã¯èœåããNFAãšã³ãžã³ãéåžžã«åŒ·åã§æ©èœè±å¯ã«ããå èªã¿ã»åŸèªã¿ãããã¯ãªãã¡ã¬ã³ã¹ãæã€è€éãªãã¿ãŒã³ãå¯èœã«ããŠããŸããããããããã¯ãŸãã壿» çãªããã¯ãã©ããã³ã°ãå¯èœã«ããã¡ã«ããºã ã§ããããã圌ãã®ã¢ãã¬ã¹è ±ã§ããããŸãã
ãã®ã¬ã€ãã®æ®ãã®éšåã§ã¯ãéçºè ãæãé »ç¹ã«ããã©ãŒãã³ã¹åé¡ã«ééããNFAãšã³ãžã³ã®å¶åŸ¡ã«çŠç¹ãåœãŠãŠæé©åãã¯ããã¯ã説æããŸãã
NFAãšã³ãžã³ã®ããã®äž»èŠãªæé©ååå
ããã§ã¯ã髿§èœãªæ£èŠè¡šçŸãæžãããã«äœ¿çšã§ããå®è·µçã§å®è¡å¯èœãªãã¯ããã¯ã«é£ã³èŸŒã¿ãŸãããã
1. å ·äœçã«èšè¿°ããïŒç²ŸåºŠã®å
æãäžè¬çãªããã©ãŒãã³ã¹ã®ã¢ã³ããã¿ãŒã³ã¯ã.*ã®ãããªé床ã«äžè¬çãªã¯ã€ã«ãã«ãŒãã䜿çšããããšã§ããããã.ã¯ïŒã»ãšãã©ïŒãã¹ãŠã®æåã«ãããããã¢ã¹ã¿ãªã¹ã¯*ã¯ã0å以äžããæå³ããŸããããããçµã¿åããããšããšã³ãžã³ã«æååã®æ®ãå
šäœãè²ªæ¬²ã«æ¶è²»ããããã®åŸããã¿ãŒã³ã®æ®ãã®éšåããããã§ããã確èªããããã«1æåãã€ããã¯ãã©ãã¯ããããã«æç€ºããŸããããã¯éåžžã«éå¹çã§ãã
æªãäŸïŒHTMLã®ã¿ã€ãã«ãè§£æïŒïŒ
<title>.*</title>
倧ããªHTMLããã¥ã¡ã³ãã«å¯ŸããŠã.*ã¯ãŸããã¡ã€ã«ã®çµãããŸã§ãã¹ãŠã«ãããããŸãããã®åŸãæåŸã®</title>ãèŠã€ãããŸã§ã1æåãã€ããã¯ãã©ãã¯ããŸããããã¯å€ãã®äžå¿
èŠãªäœæ¥ã§ãã
è¯ãäŸïŒåŠå®æåã¯ã©ã¹ã䜿çšïŒïŒ
<title>[^<]*</title>
ãã®ããŒãžã§ã³ã¯ã¯ããã«å¹ççã§ããåŠå®æåã¯ã©ã¹[^<]*ã¯ãã'<'ã§ã¯ãªãä»»æã®æåã«0å以äžãããããããšããæå³ã§ãããšã³ãžã³ã¯åé²ããæåã®'<'ã«åœãããŸã§æåãæ¶è²»ããŸããããã¯ãã©ãã¯ããå¿
èŠã¯ãŸã£ãããããŸãããããã¯çŽæ¥çã§ææ§ãã®ãªãæç€ºã§ããã倧å¹
ãªããã©ãŒãã³ã¹åäžã«ã€ãªãããŸãã
2. 貪欲ãšé å»¶ããã¹ã¿ãŒããïŒã¯ãšã¹ãã§ã³ããŒã¯ã®å
æ£èŠè¡šçŸã®éæå®åã¯ãããã©ã«ãã§è²ªæ¬²ã§ããããã¯ããã¿ãŒã³å šäœããããããããšã蚱容ãã€ã€ãã§ããã ãå€ãã®ããã¹ãã«ãããããããšãæå³ããŸãã
- 貪欲ïŒ
*,+,?,{n,m}
éæå®åã®åŸã«ã¯ãšã¹ãã§ã³ããŒã¯ã远å ããããšã§ãä»»æã®éæå®åãé å»¶ïŒlazyïŒã«ããããšãã§ããŸããé å»¶éæå®åã¯ãã§ããã ãå°ãªãããã¹ãã«ãããããŸãã
- é
å»¶ïŒ
*?,+?,??,{n,m}?
äŸïŒããŒã«ãã¿ã°ã®ãããã³ã°
å
¥åæååïŒ<b>First</b> and <b>Second</b>
- 貪欲ãªãã¿ãŒã³ïŒ
<b>.*</b>
ããã¯<b>First</b> and <b>Second</b>ã«ãããããŸãã.*ã¯æåŸã®</b>ãŸã§ãã¹ãŠãè²ªæ¬²ã«æ¶è²»ããŸããã - é
å»¶ãªãã¿ãŒã³ïŒ
<b>.*?</b>
ããã¯æåã®è©Šè¡ã§<b>First</b>ã«ãããããå床æ€çŽ¢ãããš<b>Second</b>ã«ãããããŸãã.*?ã¯ãã¿ãŒã³ã®æ®ãïŒ</b>ïŒããããããã®ã«å¿ èŠãªæå°éã®æåæ°ã«ãããããŸããã
é å»¶ãããã¯ç¹å®ã®ãããã³ã°åé¡ã解決ã§ããŸãããããã©ãŒãã³ã¹ã®äžèœè¬ã§ã¯ãããŸãããé å»¶ãããã®åã¹ãããã§ããšã³ãžã³ã¯ãã¿ãŒã³ã®æ¬¡ã®éšåãããããããã©ããããã§ãã¯ããå¿ èŠããããŸããéåžžã«å ·äœçãªãã¿ãŒã³ïŒåã®ãã€ã³ãã®åŠå®æåã¯ã©ã¹ãªã©ïŒã¯ããã°ãã°é å»¶ãã¿ãŒã³ãããé«éã§ãã
ããã©ãŒãã³ã¹ã®é åºïŒæéããæé ãžïŒïŒ
- å
·äœç/åŠå®æåã¯ã©ã¹ïŒ
<b>[^<]*</b> - é
å»¶éæå®åïŒ
<b>.*?</b> - å€ãã®ããã¯ãã©ãã¯ã䌎ã貪欲ãªéæå®åïŒ
<b>.*</b>
3. 壿» çãªããã¯ãã©ããã³ã°ãé¿ããïŒãã¹ãããéæå®åãå¶åŸ¡ãã
æåã®äŸã§èŠãããã«ã壿» çãªããã¯ãã©ããã³ã°ã®çŽæ¥çãªåå ã¯ãéæå®åãæã€ã°ã«ãŒããåãããã¹ãã«ãããã§ããå¥ã®éæå®åãå«ãã§ãããã¿ãŒã³ã§ãããšã³ãžã³ã¯ãå ¥åæååãåå²ããè€æ°ã®æ¹æ³ãããææ§ãªç¶æ³ã«çŽé¢ããŸãã
åé¡ã®ãããã¿ãŒã³ïŒ
(a+)+(a*)*(a|aa)+- å
¥åæååã«å€ãã®'a'ãš'b'ãå«ãŸããå Žåã®
(a|b)*
解決çã¯ããã¿ãŒã³ãææ§ã§ãªãããããšã§ãããšã³ãžã³ãäžããããæååã«ãããããæ¹æ³ãäžã€ãããªãããã«ãããã®ã§ãã
4. ã¢ãããã¯ã°ã«ãŒããšæææ Œéæå®åãæŽ»çšãã
ããã¯ãæ£èŠè¡šçŸããããã¯ãã©ããã³ã°ãæé€ããããã®æã匷åãªãã¯ããã¯ã®äžã€ã§ããã¢ãããã¯ã°ã«ãŒããšæææ Œéæå®åã¯ããšã³ãžã³ã«æ¬¡ã®ããã«äŒããŸããããã¿ãŒã³ã®ãã®éšåã«äžåºŠããããããããã®æåãæ±ºããŠè¿ããªãã§ãã ããããã®åŒã«ããã¯ãã©ãã¯ããªãã§ãã ãããã
æææ Œéæå®å
æææ Œéæå®åã¯ãéåžžã®éæå®åã®åŸã«+ã远å ããããšã§äœæãããŸãïŒäŸïŒ*+, ++, ?+, {n,m}+ïŒããããã¯JavaãPCREïŒPHPãRïŒãRubyãªã©ã®ãšã³ãžã³ã§ãµããŒããããŠããŸãã
äŸïŒæ°åã®åŸã«'a'ãç¶ããã®ã«ããã
å
¥åæååïŒ12345
- éåžžã®æ£èŠè¡šçŸïŒ
\d+a\d+ã¯ã12345ãã«ãããããŸããæ¬¡ã«ããšã³ãžã³ã¯'a'ã«ãããããããšããŠå€±æããŸããããã¯ãã©ãã¯ãã\d+ã¯ã1234ãã«ããããã'5'ã«å¯ŸããŠ'a'ãããããããããšããŸããããã\d+ããã¹ãŠã®æåã諊ãããŸã§ç¶ããŸãã倱æãããŸã§ã«å€ãã®äœæ¥ãå¿ èŠã§ãã - æææ Œã®æ£èŠè¡šçŸïŒ
\d++a\d++ã¯æææ Œã§ã12345ãã«ãããããŸãããšã³ãžã³ã¯æ¬¡ã«'a'ã«ãããããããšããŠå€±æããŸããéæå®åãæææ Œã§ãã£ãããããšã³ãžã³ã¯\d++ã®éšåã«ããã¯ãã©ãã¯ããããšãçŠããããŠããŸããããã«å€±æããŸããããã¯ããã§ã€ã«ãã¡ã¹ãããšåŒã°ããéåžžã«å¹ççã§ãã
ã¢ãããã¯ã°ã«ãŒã
ã¢ãããã¯ã°ã«ãŒãã¯(?>...)ãšããæ§æãæã¡ãæææ Œéæå®åãããåºããµããŒããããŠããŸãïŒäŸïŒ.NETãPythonã®æ°ãã`regex`ã¢ãžã¥ãŒã«ïŒããããã¯æææ Œéæå®åãšå
šãåãããã«åäœããŸãããã°ã«ãŒãå
šäœã«é©çšãããŸãã
æ£èŠè¡šçŸ(?>\d+)aã¯ãæ©èœçã«\d++aãšåçã§ããã¢ãããã¯ã°ã«ãŒãã䜿çšããŠãå
ã®å£æ»
çãªããã¯ãã©ããã³ã°ã®åé¡ã解決ã§ããŸãïŒ
å
ã®åé¡ïŒ(a+)+
ã¢ãããã¯ãªè§£æ±ºçïŒ((?>a+))+
ããã§ãå
åŽã®ã°ã«ãŒã(?>a+)ã'a'ã®ã·ãŒã±ã³ã¹ã«ããããããšããå€åŽã®ã°ã«ãŒããå詊è¡ããããã«ããããæ±ºããŠææŸãããšã¯ãããŸãããããã«ããææ§ãããªããªããææ°é¢æ°çãªããã¯ãã©ããã³ã°ãé²ãããŸãã
5. éžæè¢ã®é åºã¯éèŠ
NFAãšã³ãžã³ãéžæïŒ|ãã€ãã䜿çšïŒã«ééãããšãéžæè¢ãå·Šããå³ã«è©ŠããŸããããã¯ãæãå¯èœæ§ã®é«ãéžæè¢ãæåã«é
眮ãã¹ãã§ããããšãæå³ããŸãã
äŸïŒã³ãã³ãã®è§£æ
ã³ãã³ããè§£æããŠããŠã`GET`ã³ãã³ãã80%ã`SET`ã15%ã`DELETE`ã5%ã®ç¢ºçã§åºçŸããããšãããã£ãŠãããšæ³åããŠãã ããã
éå¹çïŒ^(DELETE|SET|GET)
å
¥åã®80%ã§ããšã³ãžã³ã¯ãŸã`DELETE`ã«ãããããããšããŠå€±æããããã¯ãã©ãã¯ãã`SET`ã«ãããããããšããŠå€±æããããã¯ãã©ãã¯ããæçµçã«`GET`ã§æåããŸãã
å¹ççïŒ^(GET|SET|DELETE)
ããã§ã80%ã®ç¢ºçã§ãšã³ãžã³ã¯æåã®è©Šè¡ã§ããããåŸãŸãããã®å°ããªå€æŽããæ°çŸäžè¡ãåŠçããéã«é¡èãªåœ±é¿ãäžããããšããããŸãã
6. ãã£ããã£ãäžèŠãªå Žåã¯éãã£ããã£ã°ã«ãŒãã䜿çšãã
æ£èŠè¡šçŸã®æ¬åŒ§(...)ã¯2ã€ã®ããšãè¡ããŸãããµããã¿ãŒã³ãã°ã«ãŒãåãããã®ãµããã¿ãŒã³ã«ãããããããã¹ãããã£ããã£ããŸãããã®ãã£ããã£ãããããã¹ãã¯ãåŸã§äœ¿çšããããã«ã¡ã¢ãªã«ä¿åãããŸãïŒäŸïŒ\1ã®ãããªããã¯ãªãã¡ã¬ã³ã¹ããåŒã³åºãå
ã³ãŒãã«ããæœåºã®ããïŒããã®ä¿åã«ã¯å°ãããªãããæž¬å®å¯èœãªãªãŒããŒãããããããŸãã
ã°ã«ãŒãåã®åäœã ããå¿
èŠã§ãããã¹ãããã£ããã£ããå¿
èŠããªãå Žåã¯ãéãã£ããã£ã°ã«ãŒãã䜿çšããŸãïŒ(?:...)ã
ãã£ããã£ããïŒ(https?|ftp)://([^/]+)
ããã¯ãhttpããšãã¡ã€ã³åãå¥ã
ã«ãã£ããã£ããŸãã
éãã£ããã£ïŒ(?:https?|ftp)://([^/]+)
ããã§ã¯ãhttps?|ftpãã°ã«ãŒãåããŠ://ãæ£ããé©çšãããããã«ããŠããŸãããããããããããã³ã«ã¯ä¿åããŸããããã¡ã€ã³åïŒã°ã«ãŒã1ã«ãããŸãïŒã®æœåºã®ã¿ã«é¢å¿ãããå Žåãããã¯ãããã«å¹ççã§ãã
é«åºŠãªãã¯ããã¯ãšãšã³ãžã³åºæã®ãã³ã
å èªã¿ãšåŸèªã¿ïŒåŒ·åã ãæ³šæããŠäœ¿çšãã
å
èªã¿ïŒ(?=...), (?!...)ïŒãšåŸèªã¿ïŒ(?<=...), (?ïŒã¯ãå¹
ãŒãã®ã¢ãµãŒã·ã§ã³ã§ãããããã¯å®éã«æåãæ¶è²»ããããšãªãæ¡ä»¶ããã§ãã¯ããŸããããã¯ã³ã³ããã¹ããæ€èšŒããã®ã«éåžžã«å¹ççã§ãã
äŸïŒãã¹ã¯ãŒãã®æ€èšŒ
æ°åãå«ãå¿ èŠããããã¹ã¯ãŒããæ€èšŒããæ£èŠè¡šçŸïŒ
^(?=.*\d).{8,}$
ããã¯éåžžã«å¹ççã§ããå
èªã¿(?=.*\d)ãåæ¹ãã¹ãã£ã³ããŠæ°åãååšããããšã確èªãããã®åŸã«ãŒãœã«ã¯éå§äœçœ®ã«ãªã»ãããããŸãããã¿ãŒã³ã®äž»èŠéšåã§ãã.{8,}ã¯ãåã«8æå以äžãããããããã ãã§æžã¿ãŸããããã¯ãããè€éãªåäžãã¹ã®ãã¿ãŒã³ãããåªããŠããããšãå€ãã§ãã
äºåèšç®ãšã³ã³ãã€ã«
ã»ãšãã©ã®ããã°ã©ãã³ã°èšèªã¯ãæ£èŠè¡šçŸããã³ã³ãã€ã«ãããæ¹æ³ãæäŸããŠããŸããããã¯ããšã³ãžã³ããã¿ãŒã³æååãäžåºŠè§£æããæé©åãããå éšè¡šçŸãäœæããããšãæå³ããŸããåãæ£èŠè¡šçŸãè€æ°å䜿çšããå ŽåïŒäŸïŒã«ãŒãå ïŒãåžžã«ã«ãŒãã®å€ã§äžåºŠã³ã³ãã€ã«ãã¹ãã§ãã
Pythonã®äŸïŒ
import re
# æ£èŠè¡šçŸãäžåºŠã³ã³ãã€ã«ãã
log_pattern = re.compile(r'(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})')
for line in log_file:
# ã³ã³ãã€ã«æžã¿ãªããžã§ã¯ãã䜿çšãã
match = log_pattern.search(line)
if match:
print(match.group(1))
ãããæ ããšããšã³ãžã³ã¯åã€ãã¬ãŒã·ã§ã³ã§æååãã¿ãŒã³ãåè§£æããããšã匷ããããããã¯CPUãµã€ã¯ã«ã®å€§ããªç¡é§ã§ãã
æ£èŠè¡šçŸã®ãããã¡ã€ãªã³ã°ãšãããã°ã®ããã®å®è·µçãªããŒã«
çè«ã¯çŽ æŽãããã§ãããçŸèã¯äžèŠã«åŠããã§ããçŸä»£ã®ãªã³ã©ã€ã³æ£èŠè¡šçŸãã¹ã¿ãŒã¯ãããã©ãŒãã³ã¹ãçè§£ããããã®éåžžã«è²ŽéãªããŒã«ã§ãã
regex101.comã®ãããªãŠã§ããµã€ãã¯ããRegex Debuggerãããã¹ãããè§£èª¬ãæ©èœãæäŸããŠããŸããæ£èŠè¡šçŸãšãã¹ãæååã貌ãä»ãããšãNFAãšã³ãžã³ãæååãã©ã®ããã«åŠçãããã®ã¹ããããã€ã¹ãããã®ãã¬ãŒã¹ãæäŸããŠãããŸãããã¹ãŠã®ããã詊è¡ã倱æãããã¯ãã©ãã¯ãæç€ºçã«ç€ºããŸããããã¯ãæ£èŠè¡šçŸããªãé ãã®ããèŠèŠåããç§ãã¡ãè°è«ããæé©åã®åœ±é¿ããã¹ãããããã®æè¯ã®æ¹æ³ã§ãã
æ£èŠè¡šçŸã®æé©åã®ããã®å®è·µçãªãã§ãã¯ãªã¹ã
è€éãªæ£èŠè¡šçŸããããã€ããåã«ããã®å¿ã®äžã®ãã§ãã¯ãªã¹ããå®è¡ããŠãã ããïŒ
- å
·äœæ§ïŒããéãå®å
šãªåŠå®æåã¯ã©ã¹
[^"\r\n]*ã䜿ãããšããã§ãé å»¶ã®.*?ã貪欲ãª.*ã䜿çšããŠããªããïŒ - ããã¯ãã©ããã³ã°ïŒ
(a+)+ã®ãããªãã¹ãããéæå®åã¯ãªããïŒç¹å®ã®å ¥åã§å£æ» çãªããã¯ãã©ããã³ã°ã«ã€ãªããå¯èœæ§ã®ããææ§ãã¯ãªããïŒ - æææ ŒïŒåè©äŸ¡ãã¹ãã§ãªããšããã£ãŠãããµããã¿ãŒã³ãžã®ããã¯ãã©ããã³ã°ãé²ãããã«ãã¢ãããã¯ã°ã«ãŒã
(?>...)ãæææ Œéæå®å*+ã䜿çšã§ãããïŒ - éžæïŒ
(a|b|c)ã®éžæè¢ã§ãæãäžè¬çãªéžæè¢ãæåã«ãªã¹ããããŠãããïŒ - ãã£ããã£ïŒãã¹ãŠã®ãã£ããã£ã°ã«ãŒããå¿
èŠãïŒäžéšãéãã£ããã£ã°ã«ãŒã
(?:...)ã«å€æããŠãªãŒããŒããããåæžã§ããªããïŒ - ã³ã³ãã€ã«ïŒãã®æ£èŠè¡šçŸãã«ãŒãã§äœ¿çšããŠããå Žåãäºåã«ã³ã³ãã€ã«ããŠãããïŒ
ã±ãŒã¹ã¹ã¿ãã£ïŒãã°ããŒãµãŒã®æé©å
ãã¹ãŠããŸãšããŠã¿ãŸããããæšæºçãªãŠã§ããµãŒããŒã®ãã°è¡ãè§£æããŠãããšæ³åããŠãã ããã
ãã°è¡ïŒ127.0.0.1 - - [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326
æ¹ååïŒé ãæ£èŠè¡šçŸïŒïŒ
^(\S+) (\S+) (\S+) \[(.*)\] "(.*)" (\d+) (\d+)$
ãã®ãã¿ãŒã³ã¯æ©èœããŸãããéå¹çã§ããæ¥ä»ãšãªã¯ãšã¹ãæååã«å¯Ÿãã(.*)ã¯ãç¹ã«äžæ£ãªåœ¢åŒã®ãã°è¡ãããå Žåã«ã倧å¹
ã«ããã¯ãã©ãã¯ããŸãã
æ¹ååŸïŒæé©åãããæ£èŠè¡šçŸïŒïŒ
^(\S+) (\S+) (\S+) \[[^\]]+\] "(?:GET|POST|HEAD) ([^ "]+) HTTP/[\d.]+" (\d{3}) (\d+)$
æ¹åç¹ã®èª¬æïŒ
\[(.*)\]ã\[[^\]]+\]ã«ãªããŸãããæ±çšçã§ããã¯ãã©ãã¯ãã.*ããéãæ¬åŒ§ä»¥å€ã®ãã¹ãŠã«ãããããéåžžã«å ·äœçãªåŠå®æåã¯ã©ã¹ã«çœ®ãæããŸãããããã¯ãã©ãã¯ã¯äžèŠã§ãã"(.*)"ã"(?:GET|POST|HEAD) ([^ "]+) HTTP/[\d.]+"ã«ãªããŸãããããã¯å€§ããªæ¹åã§ãã- æåŸ ããHTTPã¡ãœãããéãã£ããã£ã°ã«ãŒãã䜿çšããŠæç€ºçã«æå®ããŠããŸãã
- URLãã¹ããæ±çšçãªã¯ã€ã«ãã«ãŒãã®ä»£ããã«
[^ "]+ïŒã¹ããŒã¹ãŸãã¯åŒçšç¬Šã§ã¯ãªã1æå以äžïŒã§ããããããŠããŸãã - HTTPãããã³ã«ã®åœ¢åŒãæå®ããŠããŸãã
- ã¹ããŒã¿ã¹ã³ãŒãã®
(\d+)ã¯ãHTTPã¹ããŒã¿ã¹ã³ãŒããåžžã«3æ¡ã§ããããã(\d{3})ã«çµã蟌ã¿ãŸããã
ãæ¹ååŸãã®ããŒãžã§ã³ã¯ãåçã«é«éã§ReDoSæ»æã«å¯ŸããŠå®å šã§ããã ãã§ãªãããã°è¡ã®ãã©ãŒããããããå³å¯ã«æ€èšŒãããããããå ç¢ã§ããããŸãã
çµè«
æ£èŠè¡šçŸã¯äž¡åã®å£ã§ããæ³šæãšç¥èãæã£ãŠäœ¿ãã°ãè€éãªããã¹ãåŠçåé¡ã«å¯Ÿãããšã¬ã¬ã³ããªè§£æ±ºçãšãªããŸããäžæ³šæã«äœ¿çšããã°ãããã©ãŒãã³ã¹ã®æªå€¢ãšãªãåŸãŸããéèŠãªã®ã¯ãNFAãšã³ãžã³ã®ããã¯ãã©ããã³ã°ã¡ã«ããºã ãæèããå¯èœãªéããšã³ãžã³ãåäžã®ææ§ãã®ãªããã¹ã«å°ããã¿ãŒã³ãæžãããšã§ãã
å ·äœçã«èšè¿°ãã貪欲ããšé å»¶ã®ãã¬ãŒããªããçè§£ããã¢ãããã¯ã°ã«ãŒãã§ææ§ããæé€ãããã¿ãŒã³ããã¹ãããããã«é©åãªããŒã«ã䜿çšããããšã§ãæ£èŠè¡šçŸãæœåšçãªè² åµãããã³ãŒãå ã®åŒ·åã§å¹ççãªè³ç£ã«å€ããããšãã§ããŸãã仿¥ããæ£èŠè¡šçŸã®ãããã¡ã€ãªã³ã°ãå§ããããéããããä¿¡é Œæ§ã®é«ãã¢ããªã±ãŒã·ã§ã³ãå®çŸããŸãããã